package com.jms.web.mvc.resolver;

import com.jms.web.mvc.context.WebMvcContext;
import com.jms.web.mvc.creator.ArgumentCreator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Parameter;
import java.util.List;

/**
 * 处理器方法参数解析器
 * 用于解析HTTP请求中控制器方法的参数值
 */
public class HandlerMethodArgumentResolver {
    private static WebMvcContext webMvcContext;

    /**
     * 设置Web MVC上下文
     * @param webMvcContext Web MVC上下文对象
     */
    public static void setWebMvcContext(WebMvcContext webMvcContext) {
        HandlerMethodArgumentResolver.webMvcContext = webMvcContext;
    }

    /**
     * 解析方法参数
     * 根据请求信息和方法参数定义，通过参数创建器生成对应的参数值
     * @param request HTTP请求对象
     * @param response HTTP响应对象
     * @param parameters 方法参数数组
     * @return 解析后的参数值数组
     */
    public static Object[] resolveArguments(HttpServletRequest request, HttpServletResponse response, Parameter[] parameters, Object handler) {
        // 获取参数创建器列表
        List<ArgumentCreator> argumentCreators = webMvcContext.getArgumentCreators();
        Object[] arguments = new Object[parameters.length];

        // 遍历每个参数，通过参数创建器创建参数值
        for (int i = 0; i < parameters.length; i++) {
            Parameter parameter = parameters[i];
            for (ArgumentCreator argumentCreator : argumentCreators) {
                arguments[i] = argumentCreator.create(request, response, parameter, handler);
                if (arguments[i] != null) break;
            }
        }
        return arguments;
    }
}
